#include<iostream>
using namespace std;
#include<unistd.h>
#include<signal.h>
#include<vector>



#define SIGNUM 2
#define MAX_SIGNUM 31
static vector<int> sigarr = {2,3};

static void show_pending(const sigset_t& pendings){
    for(int signo = MAX_SIGNUM;signo >=1; signo--){
        if(sigismember(&pendings,signo)){
            cout<<"1";
        }
        else cout<<"0";
    }
    cout<<"\n";
}

static void myhandler(int signo){
    cout<<signo<<"号信号已经被递达！"<<endl;//这样恢复后就不会终止
}
int main(){
    for(const auto& e:sigarr){
        signal(e,myhandler);
    }
    //1.1:先尝试屏蔽指定的信号
    sigset_t block , oblock ,pendings;
    //1.2：初始化一下信号，相当于置为0
    sigemptyset(&block);
    sigemptyset(&oblock);
    //1.3:添加要屏蔽的信号
    for(const auto& e:sigarr){
        sigaddset(&block,e);//同时屏蔽2号和3号信号
    }
    //sigaddset(&block,SIGNUM);//这里block的0就变成1了
    //1.4:设置到内核（进程）
    sigprocmask(SIGNUM,&block,&oblock);//这里是设置到了位图里，第二个参数是保留不变的

    int cnt = 10;
    //2：遍历pending的内容
    while(true){
        //2.1:初始化
        sigemptyset(&pendings);
        //2.2:获取pending位图
        sigpending(&pendings);
        //2.3:打印处理
        show_pending(pendings);
        sleep(1);
        if(cnt-- == 0){
            sigprocmask(SIGNUM,&oblock,&block);
            cout<<"恢复对信号的屏蔽，不屏蔽任何信号";//这里不会打印出来，是因为恢复了信号的屏蔽，os至少会抵达一个信号。而默认的行为就是终止
        }
    }



    return 0;
}
